<?php
/**
 * Created by PhpStorm.
 * User: fanzhaogui
 * Date: 2021/6/17
 * Time: 15:26
 */

/* 正常赋值

$m = range(1, 1000); // 内存中 开辟一个空间存贮 $m 变量的键值
var_dump(memory_get_usage()); // int(430680)

$n = $m; // 此时的$n是否也会重新开辟一个新的空间，来保存
var_dump(memory_get_usage()); // int(430712) 栈中存变量名和地址
// 如果新开闭一个新的内存空间来存储$n，那么产生较大的变化，而 $used1 几乎等于 $used2

// COW机制： Copy On Write
// 对m修改时，才会新开辟内存空间
$m = range(1, 1000);
var_dump(memory_get_usage()); //int(467632) 变大了

*/



/* 引用变量  &

//  引用赋值
$a = 2;

xdebug_debug_zval('a');
// a: (refcount=0, is_ref=0)=2
$b = &$a;
// xdebug_debug_zval('a');
xdebug_debug_zval('b');
// a: (refcount=2, is_ref=1)=2
// b: (refcount=2, is_ref=1)=2

*/



// 对象本身就是引用传递
class ObjectClass {
    protected $name = '';

    public function setName($name)
    {
        $this->name = $name;
    }
}

$obj = new ObjectClass();
xdebug_debug_zval('obj');

$obj2 = $obj;
xdebug_debug_zval('obj2');
$obj->setName("牛奶弥补");

xdebug_debug_zval('obj');

/*$data = ['a', 'b', 'c'];
foreach ($data as $key => $val) {
    $val = &$data[$key];
}

// 循环三次 的结果
// abc
// bbc
// bcc

var_dump($data); // bbc
*/

